package ejb;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import javax.ejb.LocalBean;
import javax.ejb.Remove;
import javax.ejb.Singleton;

@Singleton
@LocalBean
public class AuthValidator implements IRemoteAuthValidator {

	// /нужно бы две мапы сделать, но мне лень
	private ArrayList<String> logins;
	private ArrayList<Integer> tokens;
	private ArrayList<Long> times;
	private Timer timer;
	private long timeout;

	private class MyTask extends TimerTask {
		@Override
		public void run() {
			Long cur = System.currentTimeMillis();
			for (int i = 0; i < times.size(); i++) {
				// System.out.println("N-"+i+" cur-"+cur+" old-"+times.get(i)+" dif-"+(cur-times.get(i)+" tout-"+timeout));
				if ((cur - times.get(i)) > timeout) {
					removeAuth(logins.get(i));
				}
			}

		}
	}

	private MyTask mt;

	public AuthValidator() {
		mt = new MyTask();
		timer = new Timer();
		timer.schedule(mt, 0, 300000); // 1min=60000 проверка каждые 5мин
		timeout = 600000; // бин отваливается если не обновлялся 10мин
		logins = new ArrayList<String>();
		tokens = new ArrayList<Integer>();
		times = new ArrayList<Long>();
	}

	@Override
	synchronized public void newAuthorisation(String log, Integer tok, Long d) {
		if (!logins.contains(log)) {
			this.logins.add(log);
			this.tokens.add(tok);
			this.times.add(d);
		} else {
			int i = logins.indexOf(log);
			tokens.set(i, tok);
			times.set(i, d);
		}
	}

	@Override
	synchronized public void removeAuth(String log) {
		int i = logins.indexOf(log);
		logins.remove(i);
		tokens.remove(i);
		times.remove(i);
	}

	@Override
	synchronized public boolean checkAuth(String log, Integer tok, Long d) {
		if (logins.contains(log)) {
			int i = logins.indexOf(log);
			if (tokens.get(i).equals(tok)) {
				times.set(i, d);
				return true;
			} else
				return false;
		} else
			return false;
	}

	@Remove
	private void remove() {
		timer.cancel();
	}
}
